/**
 * Day.js工具类
 * @author CloudApp
 * @date 2023年4月5日
 */

// 引入Day.js库
const dayjs = require('../../miniprogram_npm/dayjs/index');

/**
 * 日期时间工具类
 */
class DayjsLib {
    /**
     * 获取当前时间
     * @returns {Object} dayjs对象
     */
    static now() {
        return dayjs();
    }

    /**
     * 格式化日期
     * @param {Date|String|Number} date 日期对象、字符串或时间戳
     * @param {String} format 格式化字符串，默认为'YYYY-MM-DD HH:mm:ss'
     * @returns {String} 格式化后的字符串
     */
    static format(date, format = 'YYYY-MM-DD HH:mm:ss') {
        return dayjs(date).format(format);
    }

    /**
     * 计算两个日期之间的差值
     * @param {Date|String|Number} date1 日期1
     * @param {Date|String|Number} date2 日期2
     * @param {String} unit 单位：'second'|'minute'|'hour'|'day'|'month'|'year'
     * @returns {Number} 差值
     */
    static diff(date1, date2, unit = 'day') {
        return dayjs(date1).diff(dayjs(date2), unit);
    }

    /**
     * 增加时间
     * @param {Date|String|Number} date 日期
     * @param {Number} value 增加的值
     * @param {String} unit 单位：'second'|'minute'|'hour'|'day'|'month'|'year'
     * @returns {Object} 新的dayjs对象
     */
    static add(date, value, unit = 'day') {
        return dayjs(date).add(value, unit);
    }

    /**
     * 减少时间
     * @param {Date|String|Number} date 日期
     * @param {Number} value 减少的值
     * @param {String} unit 单位：'second'|'minute'|'hour'|'day'|'month'|'year'
     * @returns {Object} 新的dayjs对象
     */
    static subtract(date, value, unit = 'day') {
        return dayjs(date).subtract(value, unit);
    }

    /**
     * 判断日期是否有效
     * @param {Date|String|Number} date 日期
     * @returns {Boolean} 是否有效
     */
    static isValid(date) {
        return dayjs(date).isValid();
    }

    /**
     * 获取星期几
     * @param {Date|String|Number} date 日期
     * @returns {Number} 0-6，表示周日至周六
     */
    static getDay(date) {
        return dayjs(date).day();
    }

    /**
     * 判断是否是同一天
     * @param {Date|String|Number} date1 日期1
     * @param {Date|String|Number} date2 日期2
     * @returns {Boolean} 是否相同
     */
    static isSameDay(date1, date2) {
        return dayjs(date1).isSame(dayjs(date2), 'day');
    }

    /**
     * 获取年份
     * @param {Date|String|Number} date 日期
     * @returns {Number} 年份
     */
    static getYear(date) {
        return dayjs(date).year();
    }

    /**
     * 获取月份（0-11）
     * @param {Date|String|Number} date 日期
     * @returns {Number} 月份，从0开始（0-11）
     */
    static getMonth(date) {
        return dayjs(date).month();
    }

    /**
     * 获取日期
     * @param {Date|String|Number} date 日期
     * @returns {Number} 日期（1-31）
     */
    static getDate(date) {
        return dayjs(date).date();
    }

    /**
     * 获取小时
     * @param {Date|String|Number} date 日期
     * @returns {Number} 小时（0-23）
     */
    static getHour(date) {
        return dayjs(date).hour();
    }

    /**
     * 获取分钟
     * @param {Date|String|Number} date 日期
     * @returns {Number} 分钟（0-59）
     */
    static getMinute(date) {
        return dayjs(date).minute();
    }

    /**
     * 获取秒
     * @param {Date|String|Number} date 日期
     * @returns {Number} 秒（0-59）
     */
    static getSecond(date) {
        return dayjs(date).second();
    }

    /**
     * 判断日期1是否在日期2之后
     * @param {Date|String|Number} date1 日期1
     * @param {Date|String|Number} date2 日期2
     * @returns {Boolean} 是否在之后
     */
    static isAfter(date1, date2) {
        return dayjs(date1).isAfter(dayjs(date2));
    }

    /**
     * 判断日期1是否在日期2之前
     * @param {Date|String|Number} date1 日期1
     * @param {Date|String|Number} date2 日期2
     * @returns {Boolean} 是否在之前
     */
    static isBefore(date1, date2) {
        return dayjs(date1).isBefore(dayjs(date2));
    }

    /**
     * 获取某个时间单位的开始时间
     * @param {Date|String|Number} date 日期
     * @param {String} unit 单位：'year'|'month'|'week'|'day'|'hour'|'minute'|'second'
     * @returns {Object} dayjs对象
     */
    static startOf(date, unit = 'day') {
        return dayjs(date).startOf(unit);
    }

    /**
     * 获取某个时间单位的结束时间
     * @param {Date|String|Number} date 日期
     * @param {String} unit 单位：'year'|'month'|'week'|'day'|'hour'|'minute'|'second'
     * @returns {Object} dayjs对象
     */
    static endOf(date, unit = 'day') {
        return dayjs(date).endOf(unit);
    }
}

module.exports = {
    dayjs,
    DayjsLib
}; 